# scripts/generate_users.py - 用户生成脚本
#!/usr/bin/env python3
"""
批量用户生成脚本
"""

import yaml
import streamlit_authenticator as stauth
from pathlib import Path
import argparse

def generate_user_config(users_data):
    """生成用户配置"""
    
    # 生成密码哈希
    passwords = [user['password'] for user in users_data]
    hashed_passwords = stauth.Hasher(passwords).generate()
    
    # 构建配置
    config = {
        'credentials': {
            'usernames': {}
        },
        'cookie': {
            'expiry_days': 30,
            'key': 'please_change_this_key_in_production',
            'name': 'streamlit_auth_cookie'
        },
        'preauthorized': {
            'emails': []
        }
    }
    
    # 添加用户
    for i, user in enumerate(users_data):
        username = user['username']
        config['credentials']['usernames'][username] = {
            'email': user['email'],
            'name': user['name'],
            'password': hashed_passwords[i]
        }
        
        # 管理员添加到预授权列表
        if user.get('is_admin', False):
            config['preauthorized']['emails'].append(user['email'])
    
    return config

def save_config(config, output_file):
    """保存配置到文件"""
    output_path = Path(output_file)
    output_path.parent.mkdir(parents=True, exist_ok=True)
    
    with open(output_path, 'w', encoding='utf-8') as f:
        yaml.dump(config, f, default_flow_style=False, allow_unicode=True, indent=2)
    
    print(f"✅ 配置已保存到: {output_file}")

def main():
    """主函数"""
    parser = argparse.ArgumentParser(description='生成Streamlit认证配置')
    parser.add_argument('--output', '-o', default='config/config.yaml', help='输出文件路径')
    parser.add_argument('--input', '-i', help='用户数据JSON文件')
    
    args = parser.parse_args()
    
    if args.input:
        # 从文件读取用户数据
        import json
        with open(args.input, 'r', encoding='utf-8') as f:
            users_data = json.load(f)
    else:
        # 默认用户数据
        users_data = [
            {
                'username': 'admin',
                'email': 'admin@example.com',
                'name': '系统管理员',
                'password': 'admin123',
                'is_admin': True
            },
            {
                'username': 'manager',
                'email': 'manager@example.com', 
                'name': '项目经理',
                'password': 'manager123',
                'is_admin': False
            },
            {
                'username': 'analyst',
                'email': 'analyst@example.com',
                'name': '数据分析师', 
                'password': 'analyst123',
                'is_admin': False
            },
            {
                'username': 'user1',
                'email': 'user1@example.com',
                'name': '普通用户1',
                'password': 'user123',
                'is_admin': False
            },
            {
                'username': 'user2', 
                'email': 'user2@example.com',
                'name': '普通用户2',
                'password': 'user123',
                'is_admin': False
            }
        ]
    
    print(f"🔨 正在生成 {len(users_data)} 个用户的配置...")
    
    # 生成配置
    config = generate_user_config(users_data)
    
    # 保存配置
    save_config(config, args.output)
    
    print(f"\n📋 生成的用户列表:")
    for user in users_data:
        role = "管理员" if user.get('is_admin', False) else "普通用户"
        print(f"  👤 {user['username']} ({user['name']}) - {role}")
    
    print(f"\n🔑 密码信息:")
    for user in users_data:
        print(f"  {user['username']}: {user['password']}")
    
    print(f"\n⚠️  安全提示:")
    print("  1. 请立即修改配置文件中的cookie密钥")
    print("  2. 生产环境中请修改所有默认密码")
    print("  3. 定期更换密码以确保安全")

if __name__ == "__main__":
    main()